//package com.smrtcold.dev.plc;
//import HslCommunication.Core.Net.IReadWriteNet;
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//import HslCommunication.Profinet.Siemens.SiemensPLCS;
//import HslCommunication.Profinet.Siemens.SiemensS7Net;
//import com.hsl.communication.*;
//import com.hsl.communication.core.IMessage.INetMessage;
//import com.hsl.communication.core.IReadWriteNet;
//import com.hsl.communication.core.NetworkBase;
//import com.hsl.communication.core.types.OperateResult;
//import com.hsl.communication.core.types.OperateResultExOne;
//import com.hsl.communication.siemens.SiemensPLCS;
//import com.hsl.communication.siemens.SiemensS7Net;
//import com.hsl.communication.util.HslHelper;
//
//import java.util.Scanner;
//
//public class HslCommunicationDemoV3_7 {
//
//    // PLC连接配置
//    private static final String PLC_IP = "192.168.1.10"; // PLC IP地址
//    private static final SiemensPLCS PLC_TYPE = SiemensPLCS.S200Smart; // PLC类型
//    private static final int PLC_PORT = 102; // PLC端口号
//
//    public static void main(String[] args) {
//        // 1. 创建PLC连接对象
//        SiemensS7Net plc = new SiemensS7Net(PLC_TYPE);
//        plc.setIpAddress(PLC_IP);
//        plc.setPort(PLC_PORT);
//
//        System.out.println("正在连接PLC: " + PLC_IP + ":" + PLC_PORT + " [" + PLC_TYPE + "]");
//
//        // 2. 建立连接
//        OperateResult connectResult = plc.ConnectServer();
//        if (!connectResult.IsSuccess) {
//            System.out.println("PLC连接失败: " + connectResult.Message);
//            return;
//        }
//        System.out.println("PLC连接成功!");
//
//        // 3. 基本读写功能演示
//        basicReadWriteOperations(plc);
//
//        // 4. 数据订阅演示
//        dataSubscriptionDemo(plc);
//
//        // 5. 用户交互菜单
//        interactiveMenu(plc);
//
//        // 6. 关闭连接
//        plc.ConnectClose();
//        System.out.println("已断开PLC连接");
//    }
//
//    /**
//     * 基本读写功能演示
//     */
//    private static void basicReadWriteOperations(IReadWriteNet plc) {
//        System.out.println("\n===== 基本读写功能演示 =====");
//
//        // 读取单个布尔值 (M0.0)
//        OperateResultExOne<Boolean> boolResult = plc.ReadBool("M0.0");
//        if (boolResult.IsSuccess) {
//            System.out.println("读取 M0.0: " + boolResult.Content);
//        } else {
//            System.out.println("读取失败: " + boolResult.Message);
//        }
//
//        // 读取单个字 (VW100)
//        OperateResultExOne<Short> shortResult = plc.ReadInt16("VW100");
//        if (shortResult.IsSuccess) {
//            System.out.println("读取 VW100: " + shortResult.Content);
//        } else {
//            System.out.println("读取失败: " + shortResult.Message);
//        }
//
//        // 写入单个布尔值 (M0.1)
//        OperateResult writeBoolResult = plc.Write("M0.1", true);
//        if (writeBoolResult.IsSuccess) {
//            System.out.println("写入 M0.1 成功");
//        } else {
//            System.out.println("写入失败: " + writeBoolResult.Message);
//        }
//
//        // 写入单个字 (VW102)
//        OperateResult writeIntResult = plc.Write("VW102", (short) 12345);
//        if (writeIntResult.IsSuccess) {
//            System.out.println("写入 VW102 成功");
//        } else {
//            System.out.println("写入失败: " + writeIntResult.Message);
//        }
//    }
//
//    /**
//     * 数据订阅演示 (HslCommunication 3.7版本)
//     */
//    private static void dataSubscriptionDemo(SiemensS7Net plc) {
//        System.out.println("\n===== 数据订阅演示 =====");
//
//        // 创建订阅客户端
//        SubscriptionClient subscription = new SubscriptionClient(plc);
//
//        // 添加订阅项 - 布尔值
//        OperateResult addBoolResult = subscription.AddSubscriptionItem("M1.0", DataType.Bool);
//        if (!addBoolResult.IsSuccess) {
//            System.out.println("添加M1.0订阅失败: " + addBoolResult.Message);
//        }
//
//        // 添加订阅项 - 整数
//        OperateResult addIntResult = subscription.AddSubscriptionItem("VW200", DataType.Int16);
//        if (!addIntResult.IsSuccess) {
//            System.out.println("添加VW200订阅失败: " + addIntResult.Message);
//        }
//
//        // 添加订阅项 - 浮点数
//        OperateResult addFloatResult = subscription.AddSubscriptionItem("VD202", DataType.Float);
//        if (!addFloatResult.IsSuccess) {
//            System.out.println("添加VD202订阅失败: " + addFloatResult.Message);
//        }
//
//        // 设置数据变化事件处理
//        subscription.OnDataChanged = (sender, args) -> {
//            for (SubscriptionItem item : args.Items) {
//                if (item.Address.equals("M1.0")) {
//                    System.out.println("[订阅通知] M1.0 状态变化: " + item.GetBoolValue());
//                }
//                else if (item.Address.equals("VW200")) {
//                    System.out.println("[订阅通知] VW200 值变化: " + item.GetInt16Value());
//                }
//                else if (item.Address.equals("VD202")) {
//                    System.out.printf("[订阅通知] VD202 值变化: %.2f%n", item.GetFloatValue());
//                }
//            }
//        };
//
//        // 启动订阅
//        subscription.Start();
//        System.out.println("订阅服务已启动，等待数据变化...");
//
//        // 模拟数据变化（实际应用中由PLC触发）
//        new Thread(() -> {
//            try {
//                // 等待一段时间后修改PLC值
//                Thread.sleep(3000);
//
//                System.out.println("\n模拟数据变化...");
//                plc.Write("M1.0", true);
//                plc.Write("VW200", (short) 100);
//                plc.Write("VD202", 25.5f);
//
//                Thread.sleep(2000);
//                System.out.println("\n再次模拟数据变化...");
//                plc.Write("M1.0", false);
//                plc.Write("VW200", (short) 200);
//                plc.Write("VD202", 30.8f);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).start();
//    }
//
//    /**
//     * 用户交互菜单
//     */
//    private static void interactiveMenu(SiemensS7Net plc) {
//        Scanner scanner = new Scanner(System.in);
//
//        while (true) {
//            System.out.println("\n===== 操作菜单 =====");
//            System.out.println("1. 读取单个位 (M区)");
//            System.out.println("2. 读取单个字 (V区)");
//            System.out.println("3. 读取浮点数 (VD区)");
//            System.out.println("4. 写入单个位 (M区)");
//            System.out.println("5. 写入单个字 (V区)");
//            System.out.println("6. 写入浮点数 (VD区)");
//            System.out.println("7. 批量读取数据");
//            System.out.println("8. 批量写入数据");
//            System.out.println("9. 退出程序");
//            System.out.print("请选择操作: ");
//
//            int choice = scanner.nextInt();
//
//            switch (choice) {
//                case 1:
//                    readBoolean(plc, scanner);
//                    break;
//                case 2:
//                    readInt16(plc, scanner);
//                    break;
//                case 3:
//                    readFloat(plc, scanner);
//                    break;
//                case 4:
//                    writeBoolean(plc, scanner);
//                    break;
//                case 5:
//                    writeInt16(plc, scanner);
//                    break;
//                case 6:
//                    writeFloat(plc, scanner);
//                    break;
//                case 7:
//                    batchRead(plc, scanner);
//                    break;
//                case 8:
//                    batchWrite(plc, scanner);
//                    break;
//                case 9:
//                    return;
//                default:
//                    System.out.println("无效选择，请重新输入");
//            }
//        }
//    }
//
//    private static void readBoolean(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入位地址 (例如 M1.0): ");
//        String address = scanner.next();
//
//        OperateResultExOne<Boolean> result = plc.ReadBool(address);
//        if (result.IsSuccess) {
//            System.out.println(address + " = " + result.Content);
//        } else {
//            System.out.println("读取失败: " + result.Message);
//        }
//    }
//
//    private static void readInt16(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入字地址 (例如 VW100): ");
//        String address = scanner.next();
//
//        OperateResultExOne<Short> result = plc.ReadInt16(address);
//        if (result.IsSuccess) {
//            System.out.println(address + " = " + result.Content);
//        } else {
//            System.out.println("读取失败: " + result.Message);
//        }
//    }
//
//    private static void readFloat(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入浮点数地址 (例如 VD200): ");
//        String address = scanner.next();
//
//        OperateResultExOne<Float> result = plc.ReadFloat(address);
//        if (result.IsSuccess) {
//            System.out.println(address + " = " + result.Content);
//        } else {
//            System.out.println("读取失败: " + result.Message);
//        }
//    }
//
//    private static void writeBoolean(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入位地址 (例如 M1.0): ");
//        String address = scanner.next();
//        System.out.print("请输入值 (true/false): ");
//        boolean value = scanner.nextBoolean();
//
//        OperateResult result = plc.Write(address, value);
//        if (result.IsSuccess) {
//            System.out.println("写入成功");
//        } else {
//            System.out.println("写入失败: " + result.Message);
//        }
//    }
//
//    private static void writeInt16(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入字地址 (例如 VW100): ");
//        String address = scanner.next();
//        System.out.print("请输入值 (0-65535): ");
//        short value = scanner.nextShort();
//
//        OperateResult result = plc.Write(address, value);
//        if (result.IsSuccess) {
//            System.out.println("写入成功");
//        } else {
//            System.out.println("写入失败: " + result.Message);
//        }
//    }
//
//    private static void writeFloat(IReadWriteNet plc, Scanner scanner) {
//        System.out.print("请输入浮点数地址 (例如 VD200): ");
//        String address = scanner.next();
//        System.out.print("请输入值: ");
//        float value = scanner.nextFloat();
//
//        OperateResult result = plc.Write(address, value);
//        if (result.IsSuccess) {
//            System.out.println("写入成功");
//        } else {
//            System.out.println("写入失败: " + result.Message);
//        }
//    }
//
//    private static void batchRead(IReadWriteNet plc, Scanner scanner) {
//        System.out.println("批量读取示例: 读取VW100-VW110");
//        short[] values = plc.ReadInt16("VW100", 6);
//        if (values != null) {
//            System.out.println("读取结果:");
//            for (int i = 0; i < values.length; i++) {
//                System.out.println("VW" + (100 + i * 2) + " = " + values[i]);
//            }
//        } else {
//            System.out.println("批量读取失败");
//        }
//    }
//
//    private static void batchWrite(IReadWriteNet plc, Scanner scanner) {
//        System.out.println("批量写入示例: 写入VW120-VW124");
//        short[] values = {100, 200, 300};
//        OperateResult result = plc.WriteInt16("VW120", values);
//        if (result.IsSuccess) {
//            System.out.println("批量写入成功");
//        } else {
//            System.out.println("批量写入失败: " + result.Message);
//        }
//    }
//}
